/*
 * Vertice.java
 *
 * Criado em 1 de Junho de 2007, 19:24
 *
 */

package dharsudoku.core.vertice;

/**
 * Implementa um vertice de um grafo
 * @author Rodrigo
 */
public class Vertice {
    
    private java.util.Set adjacentes;
    private int id;
    
    /**
     * Cria um vértice vazio(solitário)
     * @param id Identificador do grafo
     */
    public Vertice(int id) {
	this.setId(id);
	adjacentes = new java.util.HashSet();
    }
    
    /**
     * Verifica se um vértice é vizinho(adjacente)
     * deste.
     * @param vertice Segundo vértice
     * @return Verdadeiro se vértice é vizinho
     */
    public boolean isAdjacente(Vertice vertice) {
	return (vertice==this)? false : adjacentes.contains(vertice);
    }
    
    /**
     * Avalia o grau do vértice. Grau de vértice,
     * na teoria dos grafos não direcionais, é o
     * número de arestas que tocam um vértice.
     * @return Grau do vértice
     */
    public int getGrau() {
	return adjacentes.size();
    }
    
    
    /**
     * Liga-se com um segundo vértice
     * @param vertice Segundo vertice
     * @throws Exception Se houver uma tentativa de criar loops
     */
    public void ligar(Vertice vertice) throws Exception {
	
	if (vertice == this)
	    throw new Exception("Grafo não pode conter loops.");
	
	if (!this.adjacentes.contains(vertice)) {
	    this.adjacentes.add(vertice);
	}
	
	if (!vertice.adjacentes.contains(this)) {
	    vertice.adjacentes.add(this);
	}
    }
    
    /**
     * Retorna todos os vertices adjacentes
     * a esse.
     * @return Conjunto de vertices adjacentes
     */
    public java.util.Set getAdjacentes() {
	return adjacentes;
    }
    
    /**
     * Remove uma aresta que liga a este vértice
     * @param vertice Vértice que liga a aresta
     */
    public void desligar(Vertice vertice) {
	if (adjacentes.contains(vertice)) {
	    adjacentes.remove(vertice);
	}
	if (vertice.adjacentes.contains(this)) {
	    vertice.adjacentes.remove(this);
	}
    }
    
    /**
     * Remove todas arestas que ligam a este vértice
     */
    public void desligarTodos() {
	/* Itera vertices adjacentes */
	for (java.util.Iterator i = adjacentes.iterator(); i.hasNext(); ) {
	    Vertice vertice = (Vertice)i.next();
	    
	    if (vertice.adjacentes.contains(this)) {
		vertice.adjacentes.remove(this);
	    }
	}
	adjacentes.clear();
    }
    
    public String toString() {
	return Integer.toString(id);
    }
    
    public int getId() {
	return id;
    }
    
    public void setId(int id) {
	this.id = id;
    }
}
